Examining the 2014 Seattle and San Francisco summer crime data, as reported by the police, I noticed that San Francisco, despite having a population less than 30 percent greater than the population of Seattle, had more than twice as many recorded cases of drug crime. Does this reflect a much greater rate of drug use in San Francisco than in Seattle, or, rather, perhaps a difference in the manner of enforcement of drug laws or the manner in which infractions are recorded? Digging somewhat deeper—examining the data from 2013 through 2017 and on the use of certain popular drugs—I uncovered some surprising trends and obtained some possible insight into these questions.
Examining the Seattle crime data from 2013 through 2017, one of the first things I noticed was a dramatic increase in the number of incidences of crime reflected in the police data. As the following plot of incidences of crime within some selected categories shows, the fractional increase in incidences of crime in the data is roughly the same across the various categories of crime.

San Francisco has seen no such increase. Furthermore, there is no evidence of the massive crime wave that this data would suggest, if the increase were taken to reflect the actual increase in crime. For example, there are reports of increased heroin use, but nothing close to the more than 100 percent increase in use, from one year to the next, that the data on drug crime in Seattle might seem to suggest. Are there significant differences, between the cities, in the relative rates of trafficking in drugs and of mere possession? Let’s look.
library(stringr)
seattle_drugs_13_17 <- seattle_complete %>%
filter(Category == "Drugs" & Year %in% c(2013:2017))
SF_drugs_13_17 <- SF_complete %>%
mutate(`Cited or Arrested` = (str_detect(Resolution, "ARREST") |
str_detect(Resolution, "CITED"))) %>%
filter(Category == "Drugs" & Year %in% c(2013:2017))
SF_drugs_13_17 <- SF_drugs_13_17 %>%
mutate(`Drug Offense Type` =
ifelse(str_detect(Descript, "LAB APPARATUS"), "Sales, Transportation, or Production",
ifelse(str_detect(Descript, "POSSESSION"), "Possession",
ifelse(str_detect(Descript, "SALE"), "Sales, Transportation, or Production",
ifelse(str_detect(Descript, "TRANSPORT"), "Sales, Transportation, or Production",
ifelse(str_detect(Descript, "PLANTING/CULTIVATING MARIJUANA"),
"Sales, Transportation, or Production",
"Other"
))))))
seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
mutate(`Drug Offense Type` =
ifelse(str_detect(`Offense Type`, "POSSESS"), "Possession",
ifelse(str_detect(`Offense Type`, "FOUND"), "Possession",
ifelse(str_detect(`Offense Type`, "DISTRIBUTE"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "SMUGGLE"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "PRODUCE"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "SELL"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "TRAFFIC"),
"Sales, Transportation, or Production",
"Other"))))))))
joined_counts <- (seattle_drugs_13_17 %>% count(Year, `Drug Offense Type`)) %>%
left_join((SF_drugs_13_17 %>% count(Year, `Drug Offense Type`)), by = c("Year", "Drug Offense Type")) %>%
gather(n.x, n.y, key = City, value = Incidents) %>%
mutate(City = fct_recode(City,
Seattle = "n.x",
`San Francisco` = "n.y"))
#reformat some categories that will appear in the plot
joined_counts <- joined_counts %>%
mutate(`Drug Offense Type` = as.factor(`Drug Offense Type`)) %>%
mutate(`Drug Offense Type` =
fct_recode(`Drug Offense Type`,
" Sales, Transportation,\nor Production" = "Sales, Transportation, or Production",
" Possession" = "Possession"))
plot <- ggplot(joined_counts %>% filter(`Drug Offense Type` != "Other")) +
geom_col(aes(x = Year, y = Incidents, fill = City, color = `Drug Offense Type`),
position = "dodge") +
theme(legend.title = element_blank()) +
labs(x = "year", y = "count",
title = "Drug-related Police Incidents: possession versus trafficking")
ggplotly(plot) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
mutate(`Drug Type` = ifelse(str_detect(`Offense Type`, "MARIJU"), "Marijuana", #yes
ifelse(str_detect(`Offense Type`, "METH"), "Methamphetamine", #yes
ifelse(str_detect(`Offense Type`, "COCAINE"), "Cocaine", #yes
ifelse(str_detect(`Offense Type`, "HEROIN"), "Heroin", #yes
ifelse(str_detect(`Offense Type`, "PRESCRIPTION"), "Prescription", #?
ifelse(str_detect(`Offense Type`, "PILL/TABLET"), "Pill/Tablet", #?
ifelse(str_detect(`Offense Type`, "HALLUCINOGEN"), "Hallucinogen",
ifelse(str_detect(`Offense Type`, "SYNTHETIC"), "Synthetic", #?
ifelse(str_detect(`Offense Type`, "AMPHETAMINE"), "Amphetamine", #yes
ifelse(str_detect(`Offense Type`, "OPIUM"), "Opium", #yes
ifelse(str_detect(`Offense Type`, "PARAPHENALIA"), "Paraphernalia", #yes
"Other")
)))))))))))
SF_drugs_13_17 <- SF_drugs_13_17 %>%
mutate(`Drug Type` = ifelse(str_detect(Descript, "MARIJUANA"), "Marijuana", #yes
ifelse(str_detect(Descript, "COCAINE"), "Cocaine",
ifelse(str_detect(Descript, "METH-AMPHETAMINE"), "Methamphetamine",
ifelse(str_detect(Descript, "BARBITUATES"), "Barbituates",
ifelse(str_detect(Descript, "CONTROLLED SUBSTANCE"),
"Controlled Substance",
ifelse(str_detect(Descript, "HALLUCINOGENIC"), "Hallucinogenic",
ifelse(str_detect(Descript, "AMPHETAMINE"), "Amphetamine",
ifelse(str_detect(Descript, "METHADONE"), "Methadone",
ifelse(str_detect(Descript, "PARAPHERNALIA"), "Paraphernalia",
ifelse(str_detect(Descript, "OPIATES"), "Opiates",
ifelse(str_detect(Descript, "OPIUM"), "Opium",
ifelse(str_detect(Descript, "HEROIN"), "Heroin",
"Other")
))))))))))))
ggplot(SF_drugs_13_17) +
geom_bar(aes(`Drug Type`)) +
labs(title = "San Francisco") +
theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))
seattle_selected_drugs <- seattle_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
ggplot(seattle_selected_drugs) +
geom_bar(aes(`Drug Type`)) +
labs(title = "Seattle") +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1))
ggplot(SF_selected_drugs) +
geom_bar(aes(`Drug Type`)) +
labs(title = "San Francisco") +
theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))
joined_drug_counts <- (seattle_selected_drugs %>% count(Year, `Drug Type`)) %>%
left_join((SF_selected_drugs %>% count(Year, `Drug Type`)), by = c("Year", "Drug Type"))
joined_drug_counts <- joined_drug_counts %>%
rename(Seattle = n.x, `San Francisco` = n.y) %>%
gather(Seattle, `San Francisco`, key = City, value = count)
plt <- ggplot(joined_drug_counts) + geom_col(aes(x = Year, y = count, fill = City, color = `Drug Type`),
position = "dodge")
ggplotly(plt) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
library(lubridate)
library(gridExtra)
#fig.height = 2, fig.width = 3
#seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
# mutate(R_date = floor_date(mdy_hms(`Occurred Date or Date Range Start`,
# tz = "PST8PDT"), "day"))
#SF_drugs_13_17 <- SF_drugs_13_17 %>%
# mutate(R_date = mdy(Date, tz = "PST8PDT"))
seattle_selected_drugs <- seattle_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
number_of_bins <- 78
plt_seattle_selected_drugs <- ggplot(seattle_selected_drugs) +
geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "Seattle Police Incidents Related to 4 Popular Drugs",
color = "Drug: ") +
theme(legend.position = "bottom",
plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6),
legend.text = element_text(size = 6),
legend.title = element_text(size = 8)) +
guides(size = guide_legend(order = 2))
plt_SF_selected_drugs <- ggplot(SF_selected_drugs) +
geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "San Francisco Police Incidents Related to 4 Popular Drugs") +
theme(legend.position = "none",
plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
plt_seattle_all_13_17 <- seattle_complete %>%
filter(Year %in% 2013:2017) %>%
ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "Seattle Police Incidents: 2013 through 2017") +
theme(plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
plt_SF_all_13_17 <- SF_complete %>%
filter(Year %in% 2013:2017) %>%
ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "San Francisco Police Incidents: 2013 through 2017") +
theme(plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
grid.arrange(plt_seattle_all_13_17, plt_SF_all_13_17,
plt_SF_selected_drugs, plt_seattle_selected_drugs,
layout_matrix = rbind(c(1, 2),
c(4, 3),
c(4, NA)),
heights = c(5, 5, 1))

NA
LS0tCnRpdGxlOiAiRHJ1Z3MgYW5kIHRoZSBQb2xpY2U6IFNhbiBGcmFuY2lzY28gYW5kIFNlYXR0bGUiCmF1dGhvcjogIlN0dWFydCBCYXJudW0iCm91dHB1dDogaHRtbF9ub3RlYm9vawpkYXRlOiAyLzEyLzIwMTgKLS0tCgpFeGFtaW5pbmcgdGhlIDIwMTQgU2VhdHRsZSBhbmQgU2FuIEZyYW5jaXNjbyBzdW1tZXIgY3JpbWUgZGF0YSwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBvbGljZSwgSSBub3RpY2VkIHRoYXQgU2FuIEZyYW5jaXNjbywgZGVzcGl0ZSBoYXZpbmcgYSBwb3B1bGF0aW9uIGxlc3MgdGhhbiAzMCBwZXJjZW50IGdyZWF0ZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBvZiBTZWF0dGxlLCBoYWQgbW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgcmVjb3JkZWQgY2FzZXMgb2YgZHJ1ZyBjcmltZS4gRG9lcyB0aGlzIHJlZmxlY3QgYSBtdWNoIGdyZWF0ZXIgcmF0ZSBvZiBkcnVnIHVzZSBpbiBTYW4gRnJhbmNpc2NvIHRoYW4gaW4gU2VhdHRsZSwgb3IsIHJhdGhlciwgcGVyaGFwcyBhIGRpZmZlcmVuY2UgaW4gdGhlIG1hbm5lciBvZiBlbmZvcmNlbWVudCBvZiBkcnVnIGxhd3Mgb3IgdGhlIG1hbm5lciBpbiB3aGljaCBpbmZyYWN0aW9ucyBhcmUgcmVjb3JkZWQ/IERpZ2dpbmcgc29tZXdoYXQgZGVlcGVyLS0tZXhhbWluaW5nIHRoZSBkYXRhIGZyb20gMjAxMyB0aHJvdWdoIDIwMTcgYW5kIG9uIHRoZSB1c2Ugb2YgY2VydGFpbiBwb3B1bGFyIGRydWdzLS0tSSB1bmNvdmVyZWQgc29tZSBzdXJwcmlzaW5nIHRyZW5kcyBhbmQgb2J0YWluZWQgc29tZSBwb3NzaWJsZSBpbnNpZ2h0IGludG8gdGhlc2UgcXVlc3Rpb25zLgoKRXhhbWluaW5nIHRoZSBTZWF0dGxlIGNyaW1lIGRhdGEgZnJvbSAyMDEzIHRocm91Z2ggMjAxNywgb25lIG9mIHRoZSBmaXJzdCB0aGluZ3MgSSBub3RpY2VkIHdhcyBhIGRyYW1hdGljIGluY3JlYXNlIGluIHRoZSBudW1iZXIgb2YgaW5jaWRlbmNlcyBvZiBjcmltZSByZWZsZWN0ZWQgaW4gdGhlIHBvbGljZSBkYXRhLiBBcyB0aGUgZm9sbG93aW5nIHBsb3Qgb2YgaW5jaWRlbmNlcyBvZiBjcmltZSB3aXRoaW4gc29tZSBzZWxlY3RlZCBjYXRlZ29yaWVzIHNob3dzLCB0aGUgZnJhY3Rpb25hbCBpbmNyZWFzZSBpbiBpbmNpZGVuY2VzIG9mIGNyaW1lIGluIHRoZSBkYXRhIGlzIHJvdWdobHkgdGhlIHNhbWUgYWNyb3NzIHRoZSB2YXJpb3VzIGNhdGVnb3JpZXMgb2YgY3JpbWUuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGx1YnJpZGF0ZSkKClNGX2NvbXBsZXRlIDwtIHJlYWRfY3N2KCJTRl9Db21wbGV0ZS5jc3YiKQpzZWF0dGxlX2NvbXBsZXRlIDwtIHJlYWRfY3N2KCJzZWF0dGxlX2NvbXBsZXRlLmNzdiIsIGd1ZXNzX21heCA9IDEwMDAwMCkKI1dpdGggZ3Vlc3MgbWF4IGxhcmdlIGVub3VnaCwgY29sdW1ucyB0aGF0IGNvbnRhaW4gaW50ZWdlcnMgdGhhdCBleGNlZWQgdGhlIAojMzItYml0IG1heGltdW0gYXJlIHJlYWQgYXMgY2hhcmFjdGVyIHZlY3RvcnMuCgpTRl9jb21wbGV0ZSA8LSBTRl9jb21wbGV0ZSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLmludGVnZXIoc3RyX3N1YihEYXRlLCAtNCwgLTEpKSkgJT4lCiAgbXV0YXRlKENhdGVnb3J5ID0gZmN0X3JlY29kZShDYXRlZ29yeSwKICAgICAgICAiRHJ1Z3MiID0gIkRSVUcvTkFSQ09USUMiKSkKCnNlYXR0bGVfY29tcGxldGUgPC0gc2VhdHRsZV9jb21wbGV0ZSAlPiUKICByZW5hbWUoQ2F0ZWdvcnkgPSBgU3VtbWFyaXplZCBPZmZlbnNlIERlc2NyaXB0aW9uYCkgJT4lCiAgbXV0YXRlKENhdGVnb3J5ID0gZmN0X3JlY29kZShDYXRlZ29yeSwKICAgICAgICAiUHJvc3RpdHV0aW9uIiA9ICJQUk9TVElUVVRJT04iLAogICAgICAgICJEcnVncyIgPSAiTkFSQ09USUNTIiwKICAgICAgICAiV2VhcG9ucyIgPSAiV0VBUE9OIiwKICAgICAgICAiTGlxdW9yXG5sYXdzIiA9ICJMSVFVT1IgVklPTEFUSU9OIiwKICAgICAgICAiQXNzYXVsdCIgPSAiQVNTQVVMVCIsCiAgICAgICAgIkhvbWljaWRlIiA9ICJIT01JQ0lERSIsCiAgICAgICAgIlJvYmJlcnkiID0gIlJPQkJFUlkiLAogICAgICAgICJWZWhpY2xlXG50aGVmdCIgPSAiVkVISUNMRSBUSEVGVCIsCiAgICAgICAgIlRoZWZ0XG5mcm9tXG52ZWhpY2xlIiA9ICJDQVIgUFJPV0wiKSkKCnNlYXR0bGVfY29tcGxldGUgPC0gc2VhdHRsZV9jb21wbGV0ZSAlPiUKICBtdXRhdGUoUl9kYXRlID0gZmxvb3JfZGF0ZShtZHlfaG1zKGBPY2N1cnJlZCBEYXRlIG9yIERhdGUgUmFuZ2UgU3RhcnRgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHogPSAiUFNUOFBEVCIpLCAiZGF5IikpCgpTRl9jb21wbGV0ZSA8LSBTRl9jb21wbGV0ZSAlPiUKICBtdXRhdGUoUl9kYXRlID0gbWR5KERhdGUsIHR6ID0gIlBTVDhQRFQiKSkKCnNlYXR0bGVfY29tcGxldGUgJT4lCiAgZmlsdGVyKENhdGVnb3J5ICVpbiUgCiAgICAgICAgYygiUHJvc3RpdHV0aW9uIiwKICAgICAgICAiRHJ1Z3MiLAogICAgICAgICJXZWFwb25zIiwKICAgICAgICAiQXNzYXVsdCIsCiAgICAgICAgIkhvbWljaWRlIiwKICAgICAgICAiUm9iYmVyeSIsCiAgICAgICAgIlZlaGljbGVcbnRoZWZ0IiwKICAgICAgICAiVGhlZnRcbmZyb21cbnZlaGljbGUiKSkgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAyMDEzOjIwMTcpICU+JQogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCBmaWxsID0gYXMuZmFjdG9yKFllYXIpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdndGl0bGUoIkNhc2VzIG9mIFNlbGVjdGVkIENhdGVnb3JpZXMgb2YgQ3JpbWUsIGFzIHBlciBPZmZpY2lhbCBEYXRhIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyhmaWxsID0gIlllYXIiKQoKYGBgClNhbiBGcmFuY2lzY28gaGFzIHNlZW4gbm8gc3VjaCBpbmNyZWFzZS4gRnVydGhlcm1vcmUsIHRoZXJlIGlzIG5vIGV2aWRlbmNlIG9mIHRoZSBtYXNzaXZlIGNyaW1lIHdhdmUgdGhhdCB0aGlzIGRhdGEgd291bGQgc3VnZ2VzdCwgaWYgdGhlIGluY3JlYXNlIHdlcmUgdGFrZW4gdG8gcmVmbGVjdCB0aGUgYWN0dWFsIGluY3JlYXNlIGluIGNyaW1lLiBGb3IgZXhhbXBsZSwgdGhlcmUgYXJlIHJlcG9ydHMgb2YgaW5jcmVhc2VkIGhlcm9pbiB1c2UsIGJ1dCBub3RoaW5nIGNsb3NlIHRvIHRoZSBtb3JlIHRoYW4gMTAwIHBlcmNlbnQgaW5jcmVhc2UgaW4gdXNlLCBmcm9tIG9uZSB5ZWFyIHRvIHRoZSBuZXh0LCB0aGF0IHRoZSBkYXRhIG9uIGRydWcgY3JpbWUgaW4gU2VhdHRsZSBtaWdodCBzZWVtIHRvIHN1Z2dlc3QuIEFyZSB0aGVyZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcywgYmV0d2VlbiB0aGUgY2l0aWVzLCBpbiB0aGUgcmVsYXRpdmUgcmF0ZXMgb2YgdHJhZmZpY2tpbmcgaW4gZHJ1Z3MgYW5kIG9mIG1lcmUgcG9zc2Vzc2lvbj8gTGV0J3MgbG9vay4KCgpgYGB7ciwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDEwfQpsaWJyYXJ5KHN0cmluZ3IpCgpzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfY29tcGxldGUgJT4lCiAgZmlsdGVyKENhdGVnb3J5ID09ICJEcnVncyIgJiBZZWFyICVpbiUgYygyMDEzOjIwMTcpKQoKU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfY29tcGxldGUgJT4lCiAgbXV0YXRlKGBDaXRlZCBvciBBcnJlc3RlZGAgPSAoc3RyX2RldGVjdChSZXNvbHV0aW9uLCAiQVJSRVNUIikgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KFJlc29sdXRpb24sICJDSVRFRCIpKSkgJT4lCiAgZmlsdGVyKENhdGVnb3J5ID09ICJEcnVncyIgJiBZZWFyICVpbiUgYygyMDEzOjIwMTcpKQoKU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfZHJ1Z3NfMTNfMTcgJT4lIAogIG11dGF0ZShgRHJ1ZyBPZmZlbnNlIFR5cGVgID0gCiAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkxBQiBBUFBBUkFUVVMiKSwgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJQT1NTRVNTSU9OIiksICJQb3NzZXNzaW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIlNBTEUiKSwgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJUUkFOU1BPUlQiKSwgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJQTEFOVElORy9DVUxUSVZBVElORyBNQVJJSlVBTkEiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgICJPdGhlciIKICAgICAgICAgICAgICApKSkpKSkKCnNlYXR0bGVfZHJ1Z3NfMTNfMTcgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IAogICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQT1NTRVNTIiksICJQb3NzZXNzaW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkZPVU5EIiksICJQb3NzZXNzaW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkRJU1RSSUJVVEUiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiU01VR0dMRSIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQUk9EVUNFIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlNFTEwiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiVFJBRkZJQyIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgIk90aGVyIikpKSkpKSkpCiAgCgpqb2luZWRfY291bnRzIDwtIChzZWF0dGxlX2RydWdzXzEzXzE3ICU+JSBjb3VudChZZWFyLCBgRHJ1ZyBPZmZlbnNlIFR5cGVgKSkgJT4lCiAgbGVmdF9qb2luKChTRl9kcnVnc18xM18xNyAlPiUgY291bnQoWWVhciwgYERydWcgT2ZmZW5zZSBUeXBlYCkpLCBieSA9IGMoIlllYXIiLCAiRHJ1ZyBPZmZlbnNlIFR5cGUiKSkgJT4lCiAgZ2F0aGVyKG4ueCwgbi55LCBrZXkgPSBDaXR5LCB2YWx1ZSA9IEluY2lkZW50cykgJT4lCiAgbXV0YXRlKENpdHkgPSBmY3RfcmVjb2RlKENpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXR0bGUgPSAibi54IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNhbiBGcmFuY2lzY29gID0gIm4ueSIpKQoKI3JlZm9ybWF0IHNvbWUgY2F0ZWdvcmllcyB0aGF0IHdpbGwgYXBwZWFyIGluIHRoZSBwbG90CmpvaW5lZF9jb3VudHMgPC0gam9pbmVkX2NvdW50cyAlPiUgCiAgbXV0YXRlKGBEcnVnIE9mZmVuc2UgVHlwZWAgPSBhcy5mYWN0b3IoYERydWcgT2ZmZW5zZSBUeXBlYCkpICU+JQogIG11dGF0ZShgRHJ1ZyBPZmZlbnNlIFR5cGVgID0gCiAgICAgICAgICAgZmN0X3JlY29kZShgRHJ1ZyBPZmZlbnNlIFR5cGVgLAogICAgICAgICAgICAgICAgICAgICAgIiBTYWxlcywgVHJhbnNwb3J0YXRpb24sXG5vciBQcm9kdWN0aW9uIiA9ICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgIiBQb3NzZXNzaW9uIiA9ICJQb3NzZXNzaW9uIikpCgpwbG90IDwtIGdncGxvdChqb2luZWRfY291bnRzICU+JSBmaWx0ZXIoYERydWcgT2ZmZW5zZSBUeXBlYCAhPSAiT3RoZXIiKSkgKwogIGdlb21fY29sKGFlcyh4ID0gWWVhciwgeSA9IEluY2lkZW50cywgZmlsbCA9IENpdHksIGNvbG9yID0gYERydWcgT2ZmZW5zZSBUeXBlYCksCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIikgKwogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnMoeCA9ICJ5ZWFyIiwgeSA9ICJjb3VudCIsCiAgICAgICB0aXRsZSA9ICJEcnVnLXJlbGF0ZWQgUG9saWNlIEluY2lkZW50czogcG9zc2Vzc2lvbiB2ZXJzdXMgdHJhZmZpY2tpbmciKQoKZ2dwbG90bHkocGxvdCkgJT4lIGxheW91dChtYXJnaW4gPSBsaXN0KGIgPSA1MCwgbCA9IDYwLCByID0gMTAsIHQgPSA4MCkpCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gMTB9CnNlYXR0bGVfZHJ1Z3NfMTNfMTcgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBtdXRhdGUoYERydWcgVHlwZWAgPSBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIk1BUklKVSIpLCAiTWFyaWp1YW5hIiwgICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJNRVRIIiksICJNZXRoYW1waGV0YW1pbmUiLCAgICAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkNPQ0FJTkUiKSwgIkNvY2FpbmUiLCAgI3llcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiSEVST0lOIiksICJIZXJvaW4iLCAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQUkVTQ1JJUFRJT04iKSwgIlByZXNjcmlwdGlvbiIsICM/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlBJTEwvVEFCTEVUIiksICJQaWxsL1RhYmxldCIsICAjPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJIQUxMVUNJTk9HRU4iKSwgIkhhbGx1Y2lub2dlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlNZTlRIRVRJQyIpLCAiU3ludGhldGljIiwgICM/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkFNUEhFVEFNSU5FIiksICJBbXBoZXRhbWluZSIsICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiT1BJVU0iKSwgIk9waXVtIiwgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQQVJBUEhFTkFMSUEiKSwgIlBhcmFwaGVybmFsaWEiLCAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpKSkpKSkpKSkKICAKU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIFR5cGVgID0gaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJNQVJJSlVBTkEiKSwgIk1hcmlqdWFuYSIsICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJDT0NBSU5FIiksICJDb2NhaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUVUSC1BTVBIRVRBTUlORSIpLCAiTWV0aGFtcGhldGFtaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQkFSQklUVUFURVMiKSwgIkJhcmJpdHVhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQ09OVFJPTExFRCBTVUJTVEFOQ0UiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udHJvbGxlZCBTdWJzdGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJIQUxMVUNJTk9HRU5JQyIpLCAiSGFsbHVjaW5vZ2VuaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJBTVBIRVRBTUlORSIpLCAiQW1waGV0YW1pbmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUVUSEFET05FIiksICJNZXRoYWRvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJQQVJBUEhFUk5BTElBIiksICJQYXJhcGhlcm5hbGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiT1BJQVRFUyIpLCAiT3BpYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk9QSVVNIiksICJPcGl1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkhFUk9JTiIpLCAiSGVyb2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkpKSkpKSkpKSkKCmdncGxvdChTRl9kcnVnc18xM18xNykgKwogIGdlb21fYmFyKGFlcyhgRHJ1ZyBUeXBlYCkpICsKICBsYWJzKHRpdGxlID0gIlNhbiBGcmFuY2lzY28iKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQoKc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKClNGX3NlbGVjdGVkX2RydWdzIDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKCmdncGxvdChzZWF0dGxlX3NlbGVjdGVkX2RydWdzKSArCiAgZ2VvbV9iYXIoYWVzKGBEcnVnIFR5cGVgKSkgKwogIGxhYnModGl0bGUgPSAiU2VhdHRsZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCgpnZ3Bsb3QoU0Zfc2VsZWN0ZWRfZHJ1Z3MpICsKICBnZW9tX2JhcihhZXMoYERydWcgVHlwZWApKSArCiAgbGFicyh0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKCmpvaW5lZF9kcnVnX2NvdW50cyA8LSAoc2VhdHRsZV9zZWxlY3RlZF9kcnVncyAlPiUgY291bnQoWWVhciwgYERydWcgVHlwZWApKSAlPiUKICBsZWZ0X2pvaW4oKFNGX3NlbGVjdGVkX2RydWdzICU+JSBjb3VudChZZWFyLCBgRHJ1ZyBUeXBlYCkpLCBieSA9IGMoIlllYXIiLCAiRHJ1ZyBUeXBlIikpCiAgCmpvaW5lZF9kcnVnX2NvdW50cyA8LSBqb2luZWRfZHJ1Z19jb3VudHMgJT4lCiAgcmVuYW1lKFNlYXR0bGUgPSBuLngsIGBTYW4gRnJhbmNpc2NvYCA9IG4ueSkgJT4lCiAgZ2F0aGVyKFNlYXR0bGUsIGBTYW4gRnJhbmNpc2NvYCwga2V5ID0gQ2l0eSwgdmFsdWUgPSBjb3VudCkKICAKcGx0IDwtIGdncGxvdChqb2luZWRfZHJ1Z19jb3VudHMpICsgZ2VvbV9jb2woYWVzKHggPSBZZWFyLCB5ID0gY291bnQsIGZpbGwgPSBDaXR5LCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiKQoKZ2dwbG90bHkocGx0KSAlPiUgbGF5b3V0KG1hcmdpbiA9IGxpc3QoYiA9IDUwLCBsID0gNjAsIHIgPSAxMCwgdCA9IDgwKSkKCgpgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQgPSAzLCBmaWcud2lkdGggPSA0fQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShncmlkRXh0cmEpCgojZmlnLmhlaWdodCA9IDIsIGZpZy53aWR0aCA9IDMKCiNzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiMgIG11dGF0ZShSX2RhdGUgPSBmbG9vcl9kYXRlKG1keV9obXMoYE9jY3VycmVkIERhdGUgb3IgRGF0ZSBSYW5nZSBTdGFydGAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHogPSAiUFNUOFBEVCIpLCAiZGF5IikpCgojU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfZHJ1Z3NfMTNfMTcgJT4lCiMgIG11dGF0ZShSX2RhdGUgPSBtZHkoRGF0ZSwgdHogPSAiUFNUOFBEVCIpKQoKc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKClNGX3NlbGVjdGVkX2RydWdzIDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKCm51bWJlcl9vZl9iaW5zIDwtIDc4CgpwbHRfc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBnZ3Bsb3Qoc2VhdHRsZV9zZWxlY3RlZF9kcnVncykgKyAKICBnZW9tX2ZyZXFwb2x5KGFlcyh4ID0gUl9kYXRlLCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTZWF0dGxlIFBvbGljZSBJbmNpZGVudHMgUmVsYXRlZCB0byA0IFBvcHVsYXIgRHJ1Z3MiLAogICAgICAgY29sb3IgPSAiRHJ1ZzogIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSArCiAgZ3VpZGVzKHNpemUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAyKSkKCnBsdF9TRl9zZWxlY3RlZF9kcnVncyA8LSBnZ3Bsb3QoU0Zfc2VsZWN0ZWRfZHJ1Z3MpICsKICBnZW9tX2ZyZXFwb2x5KGFlcyh4ID0gUl9kYXRlLCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIFBvbGljZSBJbmNpZGVudHMgUmVsYXRlZCB0byA0IFBvcHVsYXIgRHJ1Z3MiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKcGx0X3NlYXR0bGVfYWxsXzEzXzE3IDwtIHNlYXR0bGVfY29tcGxldGUgJT4lIAogIGZpbHRlcihZZWFyICVpbiUgMjAxMzoyMDE3KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBSX2RhdGUpKSArIGdlb21fZnJlcXBvbHkoYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTZWF0dGxlIFBvbGljZSBJbmNpZGVudHM6IDIwMTMgdGhyb3VnaCAyMDE3IikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKcGx0X1NGX2FsbF8xM18xNyA8LSBTRl9jb21wbGV0ZSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUl9kYXRlKSkgKyBnZW9tX2ZyZXFwb2x5KGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2FuIEZyYW5jaXNjbyBQb2xpY2UgSW5jaWRlbnRzOiAyMDEzIHRocm91Z2ggMjAxNyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmdyaWQuYXJyYW5nZShwbHRfc2VhdHRsZV9hbGxfMTNfMTcsIHBsdF9TRl9hbGxfMTNfMTcsIAogICAgICAgICAgICAgcGx0X1NGX3NlbGVjdGVkX2RydWdzLCBwbHRfc2VhdHRsZV9zZWxlY3RlZF9kcnVncywgIAogICAgICAgICAgICAgbGF5b3V0X21hdHJpeCA9IHJiaW5kKGMoMSwgMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyg0LCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKDQsIE5BKSksCiAgICAgICAgICAgICBoZWlnaHRzID0gYyg1LCA1LCAxKSkKICAgICAgICAgICAgIApgYGAKCgoKCgo=